<?php
/**
 * Работа с каталогами
 * 
 * Класс для работы с каталогами
 * 
 * (Не закончена)
 * 
 * 
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Базовый класс для работы с каталогами
 *
 */
class Cat extends Base {
	/**
	 * Инстанс класа
	 *
	 * @var File
	 */
	private static $instance;
	/**
	 * Текущ путь дериктории
	 *
	 * @var string
	 */
	private $part;
	/**
	 * Настройки получаемой инцормации
	 * 
	 * onlyDir=true возвращает только папки
	 * onlyFile=true возвращает только файлы
	 * mask="" маска для поисков файлов по имени
	 * extentions=array() список допустимых расширений
	 * return="list/tree"
	 * deep=0 глубина вложенности если 0 то бесконечно
	 * detail=array("ext","size","date","part","counter") возвращаемая информация о файле
	 *
	 * @var array
	 */
	private $settings=array();
	public function __construct(){
		parent::__construct(__CLASS__);
	}
	/**
	 * Поличение инстанса класса
	 *
	 * @return File
	 */
	private static function getInstance() {
		if (self::$instance === null)
		return self::$instance = new self();
		else
		return self::$instance;
	}
	public function _($part=null,$settings=array()){
		$self=self::getInstance();
		//возвращает инстанс ели ничего не переданно
		if($part===null)return $self;
		if($part)$self->part=$part;
		$self->settings=$settings;
		$return=array();
		$self->get($self->part,$self,1,$return);
		return $return;
	}
	private function get($part,$self,$deep,&$return){
		//проверяем уровень вложенности
		if(isset($self->settings['deep']) && $deep>$self->settings['deep'])return array();
		//читаем дерикторию
		$d = dir($part);
		while (false !== ($entry = $d->read())) {
			//отбрасываем ссылки на уровни
			if($entry=="." || $entry=="..")continue;
			//получаем тип файла
			$fileType=filetype($part."/".$entry);
			$ext="";
			$fileName=$entry;
			//получаем расширение файла
			if(strpos($entry,".")){
				$ext=explode(".",$entry);
				$ext=$ext[count($ext)-1];
				$fileName=trim($entry,".".$ext);
			}
			//отбрасываем не файлы и не папки
			if($fileType!="dir" && $fileType!="file")continue;
			//отбрасываем не папки если стоит флаг onlyDir
			if(isset($self->settings['onlyDir']) && $fileType!="dir")continue;
			//отбрасываем не файлы если стоит флаг onlyFile
			if(isset($self->settings['onlyFile']) && $fileType!="file")continue;
			//провевяем допустимые расширения файлов
			if(isset($self->settings['extentions']) && is_array($self->settings['extentions']) && $fileType=="file"){
				$found=false;	
				//проходим по списку допустимых расширений
				foreach ($self->settings['extentions'] as $item) {
					if(strtolower($ext)==strtolower($item)){
						$found=true;
						break;
					}
				}
				if(!$found)continue;
			}
			//проверяем имя файла по маске
			if(isset($self->settings['mask']) && !ereg($self->settings['mask'],$fileName))continue;
			if($fileType=='file'){
				//если стоит флаг детальной информации то собираем её
				if(isset($self->settings['detail']) && is_array($self->settings['detail'])){
					$result=array("fileName"=>$entry);
					//записываем расширение
					if(isset($self->settings['detail']['extentions']))$result['ext']=$ext;
					//записывам путь
					if(isset($self->settings['detail']['part']))$result['part']=$part;
					//записываем дату создания, дотупа и изменения
					if(isset($self->settings['detail']['date'])){
						$info=stat($part."/".$entry);
						$result['info']=array(
							'last'=>$info['atime'],
							'create'=>$info['mtime'],
							'change'=>$info['ctime'],
						);
					}
					//записываем длину файла
					if(isset($self->settings['detail']['size'])){
						if(isset($self->settings['detail']['date']))$result['size']=$info['size'];
						else $result['size']=filesize($part."/".$entry);
					}
					$result[]=$result;
				}else{
					//иначе просто записывам имя файла
					$return[]=$entry;
				}
			}else{
				$subLevel=array();
				//получаем подпапки
				$self->get($part."/".$entry,$self,$deep+1,$subLevel);
				//если стоит флаг детальной информации то собираем её
				if(isset($self->settings['detail']) && is_array($self->settings['detail'])){
					$result=array("dirName"=>$entry);
					//записывам путь
					if(isset($self->settings['detail']['part']))$result['part']=$part;
					//считаем сколько файлов в папке и сколько в падпапках
					if(isset($self->settings['detail']['counter'])){
						$result['counter']=array(count($subLevel));
						$count=0;
						//считаем в подпапках
						foreach ($subLevel as $item) {
							if(isset($item['counter'][1]))$count+=$item['counter'][1];
							$count++;
						}
						$result['counter'][]=$count;
					}
				}
				//в зависимости от типа вывода записываем данные
				if(isset($self->settings['return']) && $self->settings['return']=='tree'){
					if(isset($self->settings['detail'])){
						$result['sublevel']=$subLevel;
						$return[]=$result;
					}else{
						$return[]=array($entry,$subLevel);
					}
				}else{
					$return=array_merge($return,$subLevel);
				}

			}
		}
		$d->close();
	}
	/**
	 * Устанавливаем путь
	 *
	 * @param string $part
	 * @return class
	 */
	public function setPart($part){
		$self=self::getInstance();
		if(!$part){
			new CoreExeption('Не указан путь',E_ERROR,__FILE__,__LINE__);
			return false;
		}
		$self->part=$part;
		return $self;
	}
	public function __toString(){
		return $this->part;
	}
}